package com.bt.lms.ui.page.sys.user;

import com.alibaba.fastjson.JSONObject;
import com.bt.lms.constants.BOConstant;
import com.bt.lms.entity.Role;
import com.bt.lms.entity.User;
import com.bt.lms.entity.page.Page;
import com.bt.lms.ui.page.sys.style.LabStyle;
import com.bt.lms.ui.page.sys.style.TableRowControl;
import com.bt.lms.ui.page.sys.user.action.*;
import com.bt.lms.ui.page.sys.utils.MyButton;
import com.bt.lms.ui.page.sys.utils.MyLabel;
import com.bt.lms.ui.page.sys.vo.UserListInfo;
import com.bt.lms.ui.page.sys.vo.UserTableViewVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.util.Callback;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户列表
 * @author 徐大永
 */
public class UserTableView extends TableView<UserListInfo> {

    /**
     * 界面所在一级容器
     */
    private final Pane inPane;

    /**
     * 分页模型
     */
    private final Page<User> page;

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 构建列表
     * @param inPane 界面所在一级容器（1位）
     * @param page 分页模型
     * @param pageSkipInfo 界面跳转信息
     */
    public UserTableView(Pane inPane, Page<User> page, PageSkipInfo pageSkipInfo){

        //维护
        this.inPane = inPane;
        this.page = page;
        this.pageSkipInfo = pageSkipInfo;

        //列表
        //写行事件(设置行工厂？)（鼠标移入移出事件）
        this.setRowFactory(param -> new TableRowControl(this));

        //背景色
        BackgroundFill backgroundFill = new BackgroundFill(Color.rgb(204, 204, 204), null, null);
        Background background = new Background(backgroundFill);
        this.setBackground(background);

        //1.列头
        //1.1 新建列头
        TableColumn<UserListInfo, UserTableViewVo> accountNumberTC = new TableColumn<>("账号");
        accountNumberTC.setSortable(false);//不可排序
        TableColumn<UserListInfo, String> nameTC = new TableColumn<>("用户姓名");
        nameTC.setSortable(false);
        TableColumn<UserListInfo, List<Role>> roleTC = new TableColumn<>("角色");
        roleTC.setSortable(false);
        TableColumn<UserListInfo, String> creatorTC = new TableColumn<>("创建人");
        creatorTC.setSortable(false);
        TableColumn<UserListInfo, LocalDateTime> creationTimeTC = new TableColumn<>("创建时间");
        creationTimeTC.setSortable(false);
        TableColumn<UserListInfo, LocalDateTime> loginTimeTC = new TableColumn<>("最近登录时间");
        loginTimeTC.setSortable(false);
        TableColumn<UserListInfo, Integer> stateTC = new TableColumn<>("状态");
        stateTC.setSortable(false);
        TableColumn<UserListInfo, UserTableViewVo> operateTC = new TableColumn<>("操作");
        operateTC.setSortable(false);

        //1.2 列头添加到视图
        this.getColumns().addAll(accountNumberTC, nameTC, roleTC, creatorTC, creationTimeTC, loginTimeTC, stateTC, operateTC);

        //2.添加数据
        //2.1 数据初始化
        List<UserListInfo> userListInfos = dataInit();
        //2.2 格式转化(用户数据集合转换成Javafx组件集合)
        ObservableList<UserListInfo> users = FXCollections.observableArrayList(userListInfos);
        //2.3 数据添加到表格
        this.setItems(users);

        //3.自定义渲染
        customVRay(accountNumberTC, roleTC, stateTC, operateTC, creationTimeTC);

        //4.映射（让每一列知道要展示的属性是哪一个）
        accountNumberTC.setCellValueFactory(new PropertyValueFactory<>("userTableViewVo"));
        nameTC.setCellValueFactory(new PropertyValueFactory<>("name"));
        roleTC.setCellValueFactory(new PropertyValueFactory<>("roles"));
        creatorTC.setCellValueFactory(new PropertyValueFactory<>("createdName"));
        creationTimeTC.setCellValueFactory(new PropertyValueFactory<>("createdTime"));
        loginTimeTC.setCellValueFactory(new PropertyValueFactory<>("loginTimeStr"));
        stateTC.setCellValueFactory(new PropertyValueFactory<>("status"));
        operateTC.setCellValueFactory(new PropertyValueFactory<>("userTableViewVo"));
    }

    /**
     * 数据初始化
     *
     * @return 初始化好的数据
     */
    private List<UserListInfo> dataInit() {

        //接收到的全部数据
        List records = page.getRecords();

        List<UserListInfo> userListInfos = new ArrayList<>();
        for (Object record : records) {
            //解JSON
            JSONObject userJSON = (JSONObject) record;
            User javaObject = userJSON.toJavaObject(User.class);
            UserListInfo userListInfo = new UserListInfo();
            try {
                BeanUtils.copyProperties(userListInfo, javaObject);
                //对象维护 用户操作视图对象
                UserTableViewVo userTableViewVo = new UserTableViewVo();
                BeanUtils.copyProperties(userTableViewVo, userListInfo);
                userListInfo.setUserTableViewVo(userTableViewVo);

            } catch (IllegalAccessException | InvocationTargetException e) {
                throw new RuntimeException(e);
            }
            userListInfos.add(userListInfo);
        }
        return userListInfos;
    }

    /**
     * 自定义渲染
     *
     * @param accountNumberTC 账号列
     * @param roleTC          角色姓名列
     * @param stateTC         状态列
     * @param operateTC       操作列
     * @param creationTimeTC  创建时间列
     */
    private void customVRay(TableColumn<UserListInfo, UserTableViewVo> accountNumberTC
            , TableColumn<UserListInfo, List<Role>> roleTC
            , TableColumn<UserListInfo, Integer> stateTC
            , TableColumn<UserListInfo, UserTableViewVo> operateTC, TableColumn<UserListInfo
            , LocalDateTime> creationTimeTC) {

        //角色
        roleTC.setCellFactory(new Callback<TableColumn<UserListInfo, List<Role>>, TableCell<UserListInfo, List<Role>>>() {
            @Override
            public TableCell<UserListInfo, List<Role>> call(TableColumn<UserListInfo, List<Role>> param) {
                return new TableCell<UserListInfo, List<Role>>() {
                    @Override
                    protected void updateItem(List<Role> roles, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(roles, empty);
                        if (roles != null) {
                            //拼接姓名对象
                            StringBuilder roleNameSB = new StringBuilder();
                            //拼接角色姓名
                            for (int i = 0; i < roles.size(); i++) {
                                String name = roles.get(i).getName();
                                if (i == 0) {
                                    roleNameSB.append(name);
                                } else {
                                    roleNameSB.append(",").append(name);
                                }
                            }
                            //界面显示
                            String roleNames = roleNameSB.toString();
                            setGraphic(new Label(roleNames));//界面显示
                        }
                    }
                };
            }
        });

        //状态
        stateTC.setCellFactory(new Callback<TableColumn<UserListInfo, Integer>, TableCell<UserListInfo, Integer>>() {
            @Override
            public TableCell<UserListInfo, Integer> call(TableColumn<UserListInfo, Integer> param) {
                return new TableCell<UserListInfo, Integer>() {
                    @Override
                    protected void updateItem(Integer item, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(item, empty);
                        if (item != null) {
                            if (item.equals(BOConstant.USER_STATUS_START)) {
                                Label startLab = new Label("启用");
                                LabStyle.status(startLab, LabStyle.OPEN);
                                setGraphic(startLab);//界面显示
                            } else if (item.equals(BOConstant.USER_STATUS_STOP)) {
                                Label stopLab = new Label("停用");
                                LabStyle.status(stopLab, LabStyle.STOP);
                                setGraphic(stopLab);//界面显示
                            }
                        }
                    }
                };
            }
        });

        //账号
        accountNumberTC.setCellFactory(new Callback<TableColumn<UserListInfo, UserTableViewVo>, TableCell<UserListInfo, UserTableViewVo>>() {
            @Override
            public TableCell<UserListInfo, UserTableViewVo> call(TableColumn<UserListInfo, UserTableViewVo> param) {
                return new TableCell<UserListInfo, UserTableViewVo>() {
                    @Override
                    protected void updateItem(UserTableViewVo userTableViewVo, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(userTableViewVo, empty);
                        if (userTableViewVo != null) {
                            String accountNumber = userTableViewVo.getAccountNumber();
                            MyLabel nameLab = new MyLabel(accountNumber);
                            LabStyle.interaction(nameLab);
                            LabStyle.pagingAction(nameLab);
                            //事件
                            ULDetailsAction ulDetailsAction = new ULDetailsAction(pageSkipInfo, userTableViewVo);
                            nameLab.setOnMouseClicked(ulDetailsAction);
                            setGraphic(nameLab);//界面显示
                        }
                    }
                };
            }
        });

        //操作
        operateTC.setCellFactory(new Callback<TableColumn<UserListInfo, UserTableViewVo>, TableCell<UserListInfo, UserTableViewVo>>() {
            @Override
            public TableCell<UserListInfo, UserTableViewVo> call(TableColumn<UserListInfo, UserTableViewVo> param) {
                return new TableCell<UserListInfo, UserTableViewVo>() {
                    @Override
                    protected void updateItem(UserTableViewVo item, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(item, empty);
                        if (item != null) {
                            HBox operateHBox = operateHBoxInit(item);
                            setGraphic(operateHBox);//界面显示
                        }
                    }

                    /**
                     * 操作盒子初始化
                     * @param userTableViewVo 用户操作视图对象
                     * @return 操作盒子
                     */
                    private HBox operateHBoxInit(UserTableViewVo userTableViewVo) {

                        //要返回的对象
                        HBox operateHBox = new HBox();
                        //布局
                        operateHBox.setPadding(new Insets(2));
                        operateHBox.setSpacing(10);

                        //状态
                        Integer status = userTableViewVo.getStatus();
                        //判断
                        if (status.equals(BOConstant.USER_STATUS_START)) {

                            //操作按钮(编辑
                            MyButton compileBtn = new MyButton("编辑");
                            operateHBox.getChildren().add(compileBtn);
                            //事件
                            ULCompileUserAction ulCompileUserAction = new ULCompileUserAction(pageSkipInfo, userTableViewVo);
                            compileBtn.setOnAction(ulCompileUserAction);

                            //操作按钮(暂停
                            MyButton suspendBtn = new MyButton("暂停");
                            operateHBox.getChildren().add(suspendBtn);
                            //事件
                            ULStopBtnAction ulStopBtnAction = new ULStopBtnAction(userTableViewVo, pageSkipInfo,inPane);
                            suspendBtn.setOnAction(ulStopBtnAction);

                            //操作按钮(删除
                            MyButton deleteBtn = new MyButton("删除");
                            operateHBox.getChildren().add(deleteBtn);
                            //事件
                            ULDeleteBtnAction ulDeleteBtnAction = new ULDeleteBtnAction(pageSkipInfo, userTableViewVo);
                            deleteBtn.setOnAction(ulDeleteBtnAction);

                            //操作按钮（重置密码
                            MyButton resetPwdBtn = new MyButton("重置密码");
                            operateHBox.getChildren().add(resetPwdBtn);
                            ULResetPwdBtnAction ulResetPwdBtnAction = new ULResetPwdBtnAction(userTableViewVo);
                            resetPwdBtn.setOnAction(ulResetPwdBtnAction);
                        } else if (status.equals(BOConstant.USER_STATUS_STOP)) {

                            //操作按钮(编辑
                            MyButton compileBtn = new MyButton("编辑");
                            operateHBox.getChildren().add(compileBtn);


                            //操作按钮(启用
                            MyButton startBtn = new MyButton("启用");
                            operateHBox.getChildren().add(startBtn);
                            //事件
                            ULStartBtnAction ulStartBtnAction = new ULStartBtnAction(pageSkipInfo, userTableViewVo);
                            startBtn.setOnAction(ulStartBtnAction);

                            //操作按钮(删除
                            MyButton deleteBtn = new MyButton("删除");
                            operateHBox.getChildren().add(deleteBtn);
                            //事件
                            ULDeleteBtnAction ulDeleteBtnAction = new ULDeleteBtnAction(pageSkipInfo, userTableViewVo);
                            deleteBtn.setOnAction(ulDeleteBtnAction);

                            //操作按钮（重置密码
                            MyButton resetPwdBtn = new MyButton("重置密码");
                            operateHBox.getChildren().add(resetPwdBtn);
                            ULResetPwdBtnAction ulResetPwdBtnAction = new ULResetPwdBtnAction(userTableViewVo);
                            resetPwdBtn.setOnAction(ulResetPwdBtnAction);
                        }

                        return operateHBox;
                    }
                };
            }
        });

        //创建时间
        creationTimeTC.setCellFactory(new Callback<TableColumn<UserListInfo, LocalDateTime>, TableCell<UserListInfo, LocalDateTime>>() {
            @Override
            public TableCell<UserListInfo, LocalDateTime> call(TableColumn<UserListInfo, LocalDateTime> param) {
                return new TableCell<UserListInfo, LocalDateTime>() {
                    @Override
                    protected void updateItem(LocalDateTime item, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(item, empty);
                        if (item != null) {
                            LocalDate creationTime = item.toLocalDate();
                            String creationTimeStr = creationTime.toString();
                            setGraphic(new Label(creationTimeStr));//界面显示
                        }
                    }
                };
            }
        });

    }
}
